package com.ceair.service.impl;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ceair.entity.LogExt;
import com.ceair.entity.SysLog;
import com.ceair.entity.request.QueryLogExtReq;
import com.ceair.entity.request.QuerySysLogReq;
import com.ceair.entity.vo.LogExtVO;
import com.ceair.mapper.SysLogMapper;
import com.ceair.mongodb.LogExtRepository;
import com.ceair.service.ISysLogService;
import com.ceair.utils.structMapper.LogExtStructMapper;
import io.micrometer.common.util.StringUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.Objects;
import java.util.Optional;

/**
 * <p>
 * 服务实现类
 * </p>
 *
 * @author wangbaohai
 * @since 2025-03-19
 */
@Service
@RequiredArgsConstructor
public class SysLogServiceImpl extends ServiceImpl<SysLogMapper, SysLog> implements ISysLogService {

    private final LogExtRepository logExtRepository;

    /**
     * 分页查询系统日志信息。
     *
     * @param querySysLogReq 查询系统日志的请求对象，包含分页信息和查询条件。
     *                       - querySysLogReq.getPageReq().getCurrent()：当前页码。
     *                       - querySysLogReq.getPageReq().getSize()：每页显示的记录数。
     * @return 返回一个分页对象 Page<SysLog>，包含查询到的系统日志数据以及分页相关信息。
     */
    @Override
    public Page<SysLog> querySysLogWithPage(QuerySysLogReq querySysLogReq) {
        // 初始化分页工具以及参数，设置当前页码和每页大小
        Page<SysLog> page = new Page<>(querySysLogReq.getPageReq().getCurrent(), querySysLogReq.getPageReq().getSize());

        // 调用mapper进行分页查询，返回查询结果
        return this.baseMapper.querySysLogWithPage(page, querySysLogReq);
    }

    /**
     * 根据ID查询系统日志详细信息
     *
     * 此方法首先检查输入的请求对象及其ID是否为空，如果任一条件满足，则直接返回null
     * 随后，使用日志ID查询MongoDB中的日志详细信息，并将结果转换为LogExtVO对象返回
     * 如果查询不到日志信息，则返回null
     *
     * @param queryLogExtReq 包含日志ID的查询请求对象，用于指定要查询的日志
     * @return LogExtVO对象，包含查询到的日志详细信息；如果查询失败或输入无效，则返回null
     */
    @Override
    public LogExtVO querySysLogDetailById(QueryLogExtReq queryLogExtReq) {
        // 判断请求参数是否为空，为空则返回null
        if (Objects.isNull(queryLogExtReq) || StringUtils.isEmpty(queryLogExtReq.getId())) {
            return null;
        }

        // 查询mongodb
        Optional<LogExt> optional = logExtRepository.findById(queryLogExtReq.getId());

        // 将查询结果转换为LogExtVO对象并返回，如果查询结果为空，则返回null
        return optional.map(LogExtStructMapper.INSTANCE::toVO).orElse(null);
    }

}
